// beepled模块定义开始，用于控制蜂鸣器和LED指示灯
module beepled (
    input wire Clk,      // 时钟信号输入
    input wire Rst_n,    // 复位信号输入，低电平有效
    input wire [18:0] data_o, // 测得的距离数据输入

    output wire beep,    // 蜂鸣器控制信号输出
    output wire [17:0] led  // LED控制信号输出
);

// 参数定义，用于设置计数器的最大值
parameter	MAX1S	=	26'd2500_0000	;// 定义1秒的时间（基于时钟周期计算）
parameter	MAX1_2S	=	26'd1250_0000	;// 定义0.5秒的时间

// 寄存器声明
reg [25:0] cnt1s						;// 1秒计数器
reg [25:0] cnt1_2s						;// 0.5秒计数器
reg [17:0] led_r							;// LED状态寄存器
reg beep_r								;// 蜂鸣器状态寄存器

// 1秒计数器逻辑，用于定时翻转LED和蜂鸣器状态
always @(posedge Clk or negedge Rst_n) begin
	if (!Rst_n) begin
		cnt1s <= 26'd0;						//复位，重新计数
	end
	else if (cnt1s == MAX1S - 1'd1) begin
		cnt1s <= 26'd0;						//记到最大数4999_9999后复位
	end
	else begin
		cnt1s <= cnt1s + 1'd1;				//其他情况+1
	end
end

// 0.5秒计数器逻辑，用于距离小于等于10cm时定时翻转蜂鸣器状态
always @(posedge Clk or negedge Rst_n) begin
	if (!Rst_n) begin
		cnt1_2s <= 26'd0;						//复位，重新计数
	end
	else if (cnt1s == MAX1_2S - 1'd1) begin
		cnt1_2s <= 26'd0;						//记到最大数2499_9999后复位
	end
	else begin
		cnt1_2s <= cnt1_2s + 1'd1;				//其他情况+1
	end
end

// LED控制逻辑，根据距离数据点亮或熄灭LED
always @(posedge Clk or negedge Rst_n) begin
    if (!Rst_n) begin
        led_r <= 18'b000000000000000000;// 复位时LED熄灭
    end
    else if(data_o/1000 <= 20) begin// 距离小于或等于20cm时LED全亮
        led_r <= 18'b111111111111111111;
    end
    else begin
        led_r <= 18'b000000000000000000;// 其他情况LED熄灭
    end
end

// 蜂鸣器控制逻辑
//蜂鸣器低电平触发，高电平关闭
always@(posedge Clk or negedge Rst_n)begin
	if(!Rst_n)begin//复位信号
		beep_r <= 1'b1;// 蜂鸣器默认关闭
	end
	// else if (data_o/1000 > 20)begin// 距离大于20米时蜂鸣器关闭
	else if (data_o/1000 > 60)begin// 距离大于60米时蜂鸣器关闭
		beep_r <= 1'b1;
	end
	else if (data_o/1000 <= 20)begin
		if (cnt1s == MAX1S - 1'd1)begin// 每1秒翻转蜂鸣器状态
			beep_r <= ~beep_r;
		end
		else if (data_o/1000 <= 10 && cnt1s == MAX1_2S - 1'd1)begin// 距离小于或等于10米且每0.5秒翻转蜂鸣器状态
			beep_r <= ~beep_r; // 其他情况保持当前状态
		end
		else begin
			beep_r <= beep_r;// 其他所有未定义情况蜂鸣器关闭
		end
	end
	else begin 
		beep_r <= 1'b0;//否则不变 
    end
end

// 将内部寄存器状态赋值给输出端口
assign beep = beep_r;
assign led = led_r;


endmodule